/**
 * 表单数据管理组合函数
 * 负责表单数据的初始化、重置和更新逻辑
 */
import { ref, reactive } from 'vue';
import { clone } from 'xe-utils';
import { createFormData, resetFormData } from './formDataFactory.js';

export function useFormData() {
  // 表单数据
  const formData = ref(createFormData());

  // 表单引用
  const refForm = ref(null);

  // 表单数据是否载入完成
  const isLoaded = ref(false);

  /**
   * 初始化表单数据
   * @param {Object} data - 初始数据
   */
  const initFormData = (data = {}) => {
    formData.value = createFormData(data);
  };

  /**
   * 重置表单
   */
  const resetForm = () => {
    if (refForm.value) {
      refForm.value.resetFields();
    }
    // 重置表单数据到初始状态
    formData.value = createFormData();
  };

  /**
   * 更新表单数据
   * @param {Object} data - 要更新的数据
   */
  const updateFormData = (data) => {
    Object.assign(formData.value, data);
  };

  /**
   * 选取不同的方法类型，自动载入默认配置
   * @param {string} action - 操作类型
   * @param {Object} defaultConfigList - 默认配置列表
   */
  const updateActionType = (action, defaultConfigList) => {
    // 暂存当前重要信息
    const currentMenuId = formData.value.menu_id;
    const currentId = formData.value.id;

    // 仅更新config部分
    if (defaultConfigList[action]) {
      formData.value.method = defaultConfigList[action].method;
      Object.assign(formData.value.config, defaultConfigList[action].config);
    }

    // 确保基本信息不被覆盖
    formData.value.type = action;
    if (currentMenuId !== null) {
      formData.value.menu_id = currentMenuId;
    }
    if (currentId !== null) {
      formData.value.id = currentId;
    }
  };

  /**
   * 修改方法名称后，自动生成方法权限代码
   * @param {string} method - 方法名
   * @param {string} permPrefix - 权限前缀
   * @param {Function} getLanguageKey - 获取语言键的函数
   */
  const updateActionCode = async (method, permPrefix, getLanguageKey) => {
    formData.value.code = permPrefix + ':' + method;

    try {
      if (formData.value.menu_id) {
        const { data: key } = await getLanguageKey({
          action: method,
          menu_id: formData.value.menu_id,
        });
        formData.value.key = key;
      }
    } catch (error) {
      console.error('获取语言键失败:', error);
    }
  };

  return {
    formData,
    refForm,
    isLoaded,
    initFormData,
    resetForm,
    updateFormData,
    updateActionType,
    updateActionCode,
  };
}
